//
//  LZRecommendViewController.m
//  LZHundredJie
//
//  Created by apple on 16/4/2.
//  Copyright © 2016年 m14a.cn. All rights reserved.
//

#import "LZRecommendViewController.h"
#import "LZRecommendCategoryItem.h"
#import "LZRecommendCategoryCell.h"

#import "LZRecommendUserCell.h"
#import "LZRecommendUserItem.h"

#import "AFNetworking.h"
#import "SVProgressHUD.h"
#import "MJExtension.h"
#import <MJRefresh/MJRefresh.h>

// 从数组里面取出来的是id类型,不能使用点.语法
// self.categoryTableView.indexPathForSelectedRow.row,可以拿到左边选中的行号
#define LZSelectedCategory self.categories[self.categoryTableView.indexPathForSelectedRow.row]

@interface LZRecommendViewController () <UITableViewDataSource, UITableViewDelegate>

/** 左边的类别数据*/
@property (nonatomic, strong) NSArray *categories;

/** 左边的类别表格*/
@property (weak, nonatomic) IBOutlet UITableView *categoryTableView;
/** 右边的用户表格*/
@property (weak, nonatomic) IBOutlet UITableView *userTableView;

/** 请求参数*/
// 该属性用来解决用户连续点击左侧cell而产生的问题
@property (nonatomic, strong) NSMutableDictionary *params;
/** AFN请求管理者*/
@property (nonatomic, strong) AFHTTPSessionManager *manager;
@end

@implementation LZRecommendViewController

- (AFHTTPSessionManager *)manager
{
    if (_manager == nil) {
        _manager = [AFHTTPSessionManager manager];
    }
    return _manager;
}

static NSString * const LZCategoryID = @"category";
static NSString * const LZUserID = @"user";

- (void)viewDidLoad {
    
    [super viewDidLoad];
    // 添加刷新控件
    [self setupRefresh];
    // 控件的初始化
    [self setupTableView];
    // 3.加载左边的类别数据显示出来
    [self loadCategories];
}

/**
 *  添加刷新控件
 */
- (void)setupRefresh
{
    self.userTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewUsers)];
    
    self.userTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreUsers)];
    self.userTableView.mj_footer.hidden = YES;
}

/**
 *  加载最新数据
 */
- (void)loadNewUsers
{
    // 拿到左边选中的行模型
    LZRecommendCategoryItem *c = LZSelectedCategory;
    // 设置当前页码为1
    c.currentPage = 1;
    // 发送请求给服务器,加载右侧的数据
    // 1.创建字典
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"a"] = @"list";
    params[@"c"] = @"subscribe";
    params[@"category_id"] = c.id;
    params[@"page"] = @(c.currentPage);
    // 把这次发的请求存起来
    self.params = params;
    // 2.发送请求
    /*
//    [LZHttpTool get:@"http://api.budejie.com/api/api_open.php" params:params success:^(NSDictionary* responseObj) {
//        // 这个block很关键,对外面的变量有一个引用的话,那么就把外面的变量拿过来,比如params
//        // block里面的params是当时传递进来的params，比如第一次传进来的是网红对应的params，
//        // 简称A--params，当用户又连续点击了其他的cell,比如精品cell，又会进来loadNewUsers.
//        // 重新创建一个params，并且赋值给self.params,此时self.params值就改变了,假设精品
//        // 对应的params简称B--params，此时self.params保存的值就是B--params，不是以前的
//        // A--params了
//        
//        if (self.params != params) return ;
//        
//        // 字典数组转模型数组
//        NSArray *users = [LZRecommendUserItem mj_objectArrayWithKeyValuesArray:responseObj[@"list"]];
//        // 清除所有旧数据
//        [c.users removeAllObjects];
//        // 添加到当前类别对应的用户数组中
//        [c.users addObjectsFromArray:users];
//        // 保存总数
//        c.total = [responseObj[@"total"] integerValue];
//        // 刷新右边的表格数据
//        [self.userTableView reloadData];
//        
//        // 顶部刷新结束
//        [self.userTableView.mj_header endRefreshing];
//        // 检测footer的状态
//        [self checkFooterState];
//        
//    } failure:^(NSError *error) {
//        if (self.params != params) return ;
//        // 提醒
//        [SVProgressHUD showErrorWithStatus:@"加载用户数据失败"];
//        // 顶部刷新结束
//        [self.userTableView.mj_header endRefreshing];
//    }];
     */

    [self.manager GET:@"http://api.budejie.com/api/api_open.php" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
        
        // 字典数组转模型数组
        NSArray *users = [LZRecommendUserItem mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
        // 这里c.users，老师对它进行懒加载了,这里必须得懒加载,如果不进行懒加载的话
        // 那么下面的两行代码相当于nil在调用,也就是什么也没有做
        // 清除所有旧数据
        [c.users removeAllObjects];
        // 添加到当前类别对应的用户数组中
        [c.users addObjectsFromArray:users];
        // 保存总数
        c.total = [responseObject[@"total"] integerValue];
        
        // 这个block很关键,对外面的变量有一个引用的话,那么就把外面的变量拿过来,比如params
        // block里面的params是当时传递进来的params，比如第一次传进来的是网红对应的params，
        // 简称A--params，当用户又连续点击了其他的cell,比如精品cell，又会进来loadNewUsers.
        // 重新创建一个params，并且赋值给self.params,此时self.params值就改变了,假设精品
        // 对应的params简称B--params，此时self.params保存的值就是B--params，不是以前的
        // A--params了
        // 还有为什么把这行代码放中间,目的是如果是连续点击了几次左侧的cell
        // 左侧点击的某些cell辛辛苦苦下载下来的数据还是可以存储起来的,
        // 只是没有不刷新表格数据,不显示出来就好了
        if (self.params != params) return ;
        
        // 刷新右边的表格数据
        [self.userTableView reloadData];
        
        // 顶部刷新结束
        [self.userTableView.mj_header endRefreshing];
        // 检测footer的状态
        [self checkFooterState];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (self.params != params) return ;
        // 提醒
        [SVProgressHUD showErrorWithStatus:@"加载用户数据失败"];
        // 顶部刷新结束
        [self.userTableView.mj_header endRefreshing];
    }];
}

/**
 *  加载更多数据,该方法在viewDidLoad加载完毕之后,没有马上调用,必须得由用户往上拖拽
    才会调用该方法,一开始不会调用,会调用loadData方法去访问数据来显示
 */
- (void)loadMoreUsers
{
    LZRecommendCategoryItem *c = LZSelectedCategory;
    // 1.创建字典
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"a"] = @"list";
    params[@"c"] = @"subscribe";
    params[@"category_id"] = c.id;
    params[@"page"] = @(++c.currentPage);
    // 把这次发的请求存起来
    self.params = params;
    // 2.发送请求
    /*
//    [LZHttpTool get:@"http://api.budejie.com/api/api_open.php" params:params success:^(NSDictionary* responseObj) {
//        if (self.params != params) return ;
//        // 字典数组转模型数组
//        NSArray *users = [LZRecommendUserItem mj_objectArrayWithKeyValuesArray:responseObj[@"list"]];
//        // 添加到当前类别对应的用户数组中
//        [c.users addObjectsFromArray:users];
//        // 刷新数据
//        [self.userTableView reloadData];
//        // 检测footer的状态
//        [self checkFooterState];
//        
//    } failure:^(NSError *error) {
//        if (self.params != params) return ;
//        // 让底部控件结束刷新,由我们来告诉第三方框架,结束刷新
//        [self.userTableView.mj_footer endRefreshing];
//    }];
     */
    
    [self.manager GET:@"http://api.budejie.com/api/api_open.php" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        // 字典数组转模型数组
        NSArray *users = [LZRecommendUserItem mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
        // 添加到当前类别对应的用户数组中
        [c.users addObjectsFromArray:users];
        
        if (self.params != params) return ;
        
        // 刷新右侧的表格
        [self.userTableView reloadData];
        // 检测footer的状态
        [self checkFooterState];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (self.params != params) return ;
        // 让底部控件结束刷新,由我们来告诉第三方框架,结束刷新
        [self.userTableView.mj_footer endRefreshing];
    }];
}

#pragma mark - 控件的初始化
- (void)setupTableView
{
    // 1.设置标题
    self.title = @"推荐关注";
    // 2.设置背景色
    self.view.backgroundColor = LZGlobalBg;
    // 4.注册方法
    [self.categoryTableView registerNib:[UINib nibWithNibName:NSStringFromClass([LZRecommendCategoryCell class]) bundle:nil] forCellReuseIdentifier:LZCategoryID];
    [self.userTableView registerNib:[UINib nibWithNibName:NSStringFromClass([LZRecommendUserCell class]) bundle:nil] forCellReuseIdentifier:LZUserID];
    // 5.设置inset,不要自动偏移64
    self.automaticallyAdjustsScrollViewInsets = NO;
    self.categoryTableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
    self.userTableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
}

#pragma mark - 加载左边的类别数据显示出来
- (void)loadCategories
{
    [SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeBlack];
    // 创建可变字典
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"a"] = @"category";
    params[@"c"] = @"subscribe";
    /*
    [LZHttpTool get:@"http://api.budejie.com/api/api_open.php"  params:params success:^(NSDictionary* responseObj) {
        
        // 字典数组转模型数组
        self.categories = [LZRecommendCategoryItem mj_objectArrayWithKeyValuesArray:responseObj[@"list"]];
        // 刷新数据
        [self.categoryTableView reloadData];
        // 默认选中第0行
//        [self.categoryTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionTop];

        [self tableView:self.categoryTableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
        
    } failure:^(NSError *error) {
        
    }];
     */
    
    [self.manager GET:@"http://api.budejie.com/api/api_open.php" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        [SVProgressHUD dismiss];
        // 字典数组转模型数组
        self.categories = [LZRecommendCategoryItem mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
        // 刷新数据
        [self.categoryTableView reloadData];
        // 默认选中第0行
        [self.categoryTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];
        // 让用户表格进入下拉刷新状态
        [self.userTableView.mj_header beginRefreshing];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [SVProgressHUD showErrorWithStatus:@"加载推荐信息失败"];
    }];
}

/**
 *  时刻检测footer的状态
 */
- (void)checkFooterState
{
    // 拿到左边选中的行模型,下面两行代码拿进来这个封装的方法里面没有关系
    LZRecommendCategoryItem *c = LZSelectedCategory;
    // 每次刷新右边数据时,都控制footer显示或者隐藏
    self.userTableView.mj_footer.hidden = (c.users.count == 0);
    
    // 判断获取下来的第1页数据和总的数据是否一样大
    if (c.users.count == c.total) {
        // 如果一样大,那么就显示已经全部加载完毕了
        [self.userTableView.mj_footer endRefreshingWithNoMoreData];
    } else {
        // 让底部控件结束刷新,由我们来告诉第三方框架,结束刷新
        [self.userTableView.mj_footer endRefreshing];
    }
}

#pragma mark - UITableViewDataSource方法

// 每组返回多少行,每次刷新表格都会来到这个方法,所以控制footer显示或者隐藏就写在这
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // 是左侧的类别表格
    if (tableView == self.categoryTableView)
        return self.categories.count;
    
    // 能够来到下面,说明是右边的用户表格,然后检查footer的状态,细节问题
    // 右边的用户表格,检测footer的状态
    [self checkFooterState];
    // 左边被选中的类别模型
    LZRecommendCategoryItem *c = LZSelectedCategory;
    // 根据左侧选中的模型,返回右侧应该显示多少行
    return c.users.count;
    
}

// 每行显示什么内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == self.categoryTableView) {  // 左边的类别表格
        // 去缓存里面找
        LZRecommendCategoryCell *cell = [tableView dequeueReusableCellWithIdentifier:LZCategoryID];
        // 取出数据赋值
        cell.item = self.categories[indexPath.row];
        // 返回cell
        return cell;
    } else {    // 右边的用户表格
        // 去缓存里面找
        LZRecommendUserCell *cell = [tableView dequeueReusableCellWithIdentifier:LZUserID];
        // 左边被选中的类别模型
        LZRecommendCategoryItem *c = LZSelectedCategory;
        // 取出数据赋值
        cell.item = c.users[indexPath.row];
        // 返回cell
        return cell;
    }

}

// 选中某一行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    /*
    // 结束刷新，可能用户连续点击了左侧好几个cell，然后加载网络数据的时候
    // 假设正在加载用户第一个点击的cell对应的数据,当用户点击的第二个cell
    // 对应的cell可能要快点，已经到达了，本来上面的刷新控件应该隐藏的，
    // 但是因为第一次点击的cell还在刷新，从而影响了第二个cell对应的界面,
    // 对header和footer都会有类似的影响,所以当用户点击的时候,我就把这两个
    // 同时结束刷新
     */
    [self.userTableView.mj_header endRefreshing];
    [self.userTableView.mj_footer endRefreshing];
    // 0.拿到数据
    LZRecommendCategoryItem *c = self.categories[indexPath.row];
    
    if (c.users.count) { // 有数据
        // 显示曾经的数据
        [self.userTableView reloadData];
    } else { // 没有数据
        // 赶紧刷新表格,目的是:马上显示当前category的用户数据,不让用户看见上一个
        // category的残留数据
        [self.userTableView reloadData];
        // 进入下拉刷新状态
        [self.userTableView.mj_header beginRefreshing];
    }
    
}
// 返回每行的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 65;
}

#pragma mark - 控制器的销毁
- (void)dealloc
{
    // 停止所有的操作
    [self.manager.operationQueue cancelAllOperations];
    // 取消请求,或者下面的代码也可以
//    [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
}

@end
